window: Update opaque region if background-color changes
authorBenjamin Otte <otte@redhat.com>
Fri, 13 Jul 2018 12:52:43 +0000 (14:52 +0200)
committerBenjamin Otte <otte@redhat.com>
Fri, 13 Jul 2018 13:02:47 +0000 (15:02 +0200)
The opaque region is only set when the background color is opaque. So
we need to do something about it when the background color changes.

However, in the case where a size allocation is going to happen, we
already do this update in size_allocate(), so in that case avoid doing
it twice.

gtk/gtkwindow.c

index 9a4c8989a565c8a033c4e280e8952487ff1a5ea5..0d19a0a06cf038d3ba01ca47429f9d089059b3a1 100644 (file)
@@ -7227,7 +7227,7 @@ subtract_corners_from_region (cairo_region_t        *region,
 
 static void
 update_opaque_region (GtkWindow           *window,
-                      GtkBorder           *border,
+                      const GtkBorder     *border,
                       const GtkAllocation *allocation)
 {
   GtkWidget *widget = GTK_WIDGET (window);
@@ -9005,11 +9005,24 @@ static void
 gtk_window_style_updated (GtkWidget *widget)
 {
   GtkCssStyleChange *change = gtk_style_context_get_change (gtk_widget_get_style_context (widget));
+  GtkWindow *window = GTK_WINDOW (widget);
 
   GTK_WIDGET_CLASS (gtk_window_parent_class)->style_updated (widget);
 
+  if (!_gtk_widget_get_alloc_needed (widget) &&
+      (change == NULL || gtk_css_style_change_changes_property (change, GTK_CSS_PROPERTY_BACKGROUND_COLOR)))
+    {
+      GtkAllocation allocation;
+      GtkBorder window_border;
+
+      _gtk_widget_get_allocation (widget, &allocation);
+      get_shadow_width (window, &window_border);
+
+      update_opaque_region (window, &window_border, &allocation);
+    }
+
   if (change == NULL || gtk_css_style_change_changes_property (change, GTK_CSS_PROPERTY_ICON_THEME))
-    update_themed_icon (GTK_WINDOW (widget));
+    update_themed_icon (window);
 }
 
 /**